package com.seka.control.utils;
import java.lang.reflect.Type;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 统一json转换工具
 */
public class JsonUtil {
    /**
     * 默认时间格式
     */
	private final static String DEFAULT_DATEFMT="yyyy-MM-dd HH:mm:ss";
	/**
	 * 默认转换
	 * @param object 数据对象
	 * @return 字符串
	 */
    public static final String toJSONString(Object object){
		return toJSONString(object,false);
	}
    
    /**
	 * 特殊json转换方式（空对象提供默认值）
	 * @param object 数据对象
	 * @param withDef 是否带默认值
	 * @return 字符串
	 */
    public static final String toJSONString(Object object, boolean withDef){
    	if(!withDef){
    		return JSON.toJSONString(object);
    	}else{
    		return JSON.toJSONString(object, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,
				SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullNumberAsZero,SerializerFeature.DisableCircularReferenceDetect);
    	}
    }

    /**
     * 特殊json转换方式（空对象提供默认值，指定日期格式）
     * @param object 数据对象
     * @param dateFmt 日期格式
     * @return 字符串
     */
    public static final String toJSONStringWithFormat(Object object,String dateFmt){
    	if(dateFmt == null){
    		dateFmt = DEFAULT_DATEFMT; 
    	}
    	return JSON.toJSONStringWithDateFormat(object,
    			dateFmt,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,
				SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullNumberAsZero,SerializerFeature.DisableCircularReferenceDetect);
    }
    
    /**
     * 将日期格式化为字符串
     * @param object 对象
     * @return 字符串
     */
    public static final String toJSONStringWithFormat(Object object){
    	return toJSONStringWithFormat(object,DEFAULT_DATEFMT);
    }
  
    /**
	 * 解析json字符串为对象 
	 * @param jsonStr json字符串
	 * @param clazz 对象类型
	 * @param <T> 对象类型
	 * @return 对象 
	 */
	public static <T> T  parseObject(String jsonStr, Class<T> clazz)  {
		if(jsonStr == null) {
			return null;
		}
		return JSON.parseObject(jsonStr.trim(), clazz);
		 
	}
	/**
	 * 解析json字符串为特定类型的对象（适用于动态Type转换）
	 * @param text json内容
	 * @param type 类型
     * @param <T> 对象类型
	 * @return 对象 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T parseObject(String text,Type  type){
		if(StringHelper.isEmpty(text)){
			return null;
		}
		return (T)JSON.parseObject(text, type);
	}
	
	
	public static <T> T parseObject(String text,TypeReference<T> type) {
		if(StringHelper.isEmpty(text)){
			return null;
		}
		return (T)JSON.parseObject(text, type);
	}
	
	/**
	 * 转换json字符串为JSONObject
	 * @param jsonStr json串
	 * @return JSONObject
	 */
	public static JSONObject parseObject(String jsonStr)  {
		if(jsonStr == null) {
			return null;
		}
		return JSON.parseObject(jsonStr.trim());
	}
	/**
	 * json对象转java
	 * @param json json对象
	 * @param clazz java对象类型
     * @param <T> 对象类型
	 * @return 对象 
	 */
	public static <T> T toJavaObject(JSON json, Class<T> clazz) {
        if(json == null) {
            return null;
        }
	    return JSON.toJavaObject(json, clazz);
	}
    /**
     * json对象转java
     * @param json json对象
     * @param type java对象类型
     * @param <T> 对象类型
     * @return 对象 
     */
	public static <T> T toJavaObject(JSON json, Type type) {
        if(json == null) {
            return null;
        }
	    return json.toJavaObject(type);
	}
}
